{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GPU1 Memory: 11172MB\n"
     ]
    }
   ],
   "source": [
    "from pynvml import *\n",
    "\n",
    "nvmlInit()\n",
    "vram = nvmlDeviceGetMemoryInfo(nvmlDeviceGetHandleByIndex(1)).free/1024.**2\n",
    "print('GPU1 Memory: %dMB' % vram)\n",
    "if vram < 8000:\n",
    "    raise Exception('GPU Memory too low')\n",
    "nvmlShutdown()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "import cv2\n",
    "import h5py\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from IPython.display import *\n",
    "from collections import Counter\n",
    "import seaborn as sns\n",
    "from tqdm import tqdm\n",
    "import pandas as pd\n",
    "import re\n",
    "import time\n",
    "import random\n",
    "\n",
    "from keras.layers import *\n",
    "from keras.models import *\n",
    "from keras.optimizers import *\n",
    "from keras.regularizers import l2\n",
    "from keras.utils.vis_utils import model_to_dot\n",
    "import keras.backend as K\n",
    "from make_parallel import make_parallel\n",
    "\n",
    "%matplotlib inline\n",
    "%config InlineBackend.figure_format = 'retina'\n",
    "IMAGE_DIR = 'image_contest_level_2'\n",
    "\n",
    "DESCRIPTION = '346_split2_4'\n",
    "MODEL_NAME = 'model_%s_best.h5' % DESCRIPTION"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 载入基本数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "df = pd.read_csv('image_contest_level_2/labels.txt', sep=' ', header=None)\n",
    "characters = u'0123456789()+-*/=君不见黄河之水天上来奔流到海复回烟锁池塘柳深圳铁板烧; '\n",
    "\n",
    "labels_len = np.array(map(lambda x:len(x.decode('utf-8')), df[0]))\n",
    "n_len = 51\n",
    "n, width, height, n_class, channels = 100000, 900, 81, len(characters), 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def decode(out):\n",
    "    return ''.join([characters[x] for x in out if x < n_class-1 and x > -1])\n",
    "\n",
    "def disp2(img):\n",
    "    cv2.imwrite('a.png', img)\n",
    "    return display(Image('a.png'))\n",
    "\n",
    "def disp(img, txt=None, first=False):\n",
    "    global index\n",
    "    if first:\n",
    "        index = 1\n",
    "        plt.figure(figsize=(16, 9))\n",
    "    else:\n",
    "        index += 1\n",
    "    plt.subplot(4, 1, index)\n",
    "    if len(img.shape) == 2:\n",
    "        plt.imshow(img, cmap='gray')\n",
    "    else:\n",
    "        plt.imshow(img[:,:,::-1])\n",
    "    if txt:\n",
    "        plt.title(txt)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 构建模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[None, 112, 10, 128] 112 1280\n"
     ]
    }
   ],
   "source": [
    "def ctc_lambda_func(args):\n",
    "    y_pred, labels, input_length, label_length = args\n",
    "    y_pred = y_pred[:, 2:, :]\n",
    "    return K.ctc_batch_cost(labels, y_pred, input_length, label_length)\n",
    "\n",
    "rnn_size = 128\n",
    "\n",
    "l2_rate = 1e-5\n",
    "\n",
    "input_tensor = Input((width, height, 3))\n",
    "x = input_tensor\n",
    "for i, n_cnn in enumerate([3, 4, 6]):\n",
    "    for j in range(n_cnn):\n",
    "        x = Conv2D(32*2**i, (3, 3), padding='same', kernel_initializer='he_uniform', \n",
    "                   kernel_regularizer=l2(l2_rate))(x)\n",
    "        x = BatchNormalization(gamma_regularizer=l2(l2_rate), beta_regularizer=l2(l2_rate))(x)\n",
    "        x = Activation('relu')(x)\n",
    "    x = MaxPooling2D((2, 2))(x)\n",
    "\n",
    "# x = AveragePooling2D((1, 2))(x)\n",
    "cnn_model = Model(input_tensor, x, name='cnn')\n",
    "\n",
    "input_tensor = Input((width, height, 3))\n",
    "x = cnn_model(input_tensor)\n",
    "\n",
    "conv_shape = x.get_shape().as_list()\n",
    "rnn_length = conv_shape[1]\n",
    "rnn_dimen = conv_shape[3]*conv_shape[2]\n",
    "\n",
    "print conv_shape, rnn_length, rnn_dimen\n",
    "\n",
    "x = Reshape(target_shape=(rnn_length, rnn_dimen))(x)\n",
    "rnn_length -= 2\n",
    "rnn_imp = 0\n",
    "\n",
    "x = Dense(rnn_size, kernel_initializer='he_uniform', kernel_regularizer=l2(l2_rate), bias_regularizer=l2(l2_rate))(x)\n",
    "x = BatchNormalization(gamma_regularizer=l2(l2_rate), beta_regularizer=l2(l2_rate))(x)\n",
    "x = Activation('relu')(x)\n",
    "# x = Dropout(0.2)(x)\n",
    "\n",
    "gru_1 = GRU(rnn_size, implementation=rnn_imp, return_sequences=True, name='gru1')(x)\n",
    "gru_1b = GRU(rnn_size, implementation=rnn_imp, return_sequences=True, go_backwards=True, name='gru1_b')(x)\n",
    "gru1_merged = add([gru_1, gru_1b])\n",
    "\n",
    "gru_2 = GRU(rnn_size, implementation=rnn_imp, return_sequences=True, name='gru2')(gru1_merged)\n",
    "gru_2b = GRU(rnn_size, implementation=rnn_imp, return_sequences=True, go_backwards=True, name='gru2_b')(gru1_merged)\n",
    "x = concatenate([gru_2, gru_2b])\n",
    "\n",
    "# x = Dropout(0.2)(x)\n",
    "x = Dense(n_class, activation='softmax', kernel_regularizer=l2(l2_rate), bias_regularizer=l2(l2_rate))(x)\n",
    "rnn_out = x\n",
    "base_model = Model(input_tensor, x)\n",
    "\n",
    "base_model2 = make_parallel(base_model, 4)\n",
    "\n",
    "labels = Input(name='the_labels', shape=[n_len], dtype='float32')\n",
    "input_length = Input(name='input_length', shape=(1,), dtype='int64')\n",
    "label_length = Input(name='label_length', shape=(1,), dtype='int64')\n",
    "loss_out = Lambda(ctc_lambda_func, name='ctc')([base_model2.output, labels, input_length, label_length])\n",
    "\n",
    "model = Model(inputs=(input_tensor, labels, input_length, label_length), outputs=loss_out)\n",
    "model.compile(loss={'ctc': lambda y_true, y_pred: y_pred}, optimizer='adam')\n",
    "model.save('test.h5')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "____________________________________________________________________________________________________\n",
      "Layer (type)                     Output Shape          Param #     Connected to                     \n",
      "====================================================================================================\n",
      "input_2 (InputLayer)             (None, 900, 81, 3)    0                                            \n",
      "____________________________________________________________________________________________________\n",
      "cnn (Model)                      (None, 112, 10, 128)  964928      input_2[0][0]                    \n",
      "____________________________________________________________________________________________________\n",
      "reshape_1 (Reshape)              (None, 112, 1280)     0           cnn[1][0]                        \n",
      "____________________________________________________________________________________________________\n",
      "dense_1 (Dense)                  (None, 112, 128)      163968      reshape_1[0][0]                  \n",
      "____________________________________________________________________________________________________\n",
      "batch_normalization_14 (BatchNor (None, 112, 128)      512         dense_1[0][0]                    \n",
      "____________________________________________________________________________________________________\n",
      "activation_14 (Activation)       (None, 112, 128)      0           batch_normalization_14[0][0]     \n",
      "____________________________________________________________________________________________________\n",
      "gru1 (GRU)                       (None, 112, 128)      98688       activation_14[0][0]              \n",
      "____________________________________________________________________________________________________\n",
      "gru1_b (GRU)                     (None, 112, 128)      98688       activation_14[0][0]              \n",
      "____________________________________________________________________________________________________\n",
      "add_1 (Add)                      (None, 112, 128)      0           gru1[0][0]                       \n",
      "                                                                   gru1_b[0][0]                     \n",
      "____________________________________________________________________________________________________\n",
      "gru2 (GRU)                       (None, 112, 128)      98688       add_1[0][0]                      \n",
      "____________________________________________________________________________________________________\n",
      "gru2_b (GRU)                     (None, 112, 128)      98688       add_1[0][0]                      \n",
      "____________________________________________________________________________________________________\n",
      "concatenate_1 (Concatenate)      (None, 112, 256)      0           gru2[0][0]                       \n",
      "                                                                   gru2_b[0][0]                     \n",
      "____________________________________________________________________________________________________\n",
      "dense_2 (Dense)                  (None, 112, 45)       11565       concatenate_1[0][0]              \n",
      "====================================================================================================\n",
      "Total params: 1,535,725\n",
      "Trainable params: 1,533,229\n",
      "Non-trainable params: 2,496\n",
      "____________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "base_model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg height=\"885pt\" viewBox=\"0.00 0.00 524.00 885.00\" width=\"524pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g class=\"graph\" id=\"graph0\" transform=\"scale(1 1) rotate(0) translate(4 881)\">\n",
       "<title>G</title>\n",
       "<polygon fill=\"white\" points=\"-4,4 -4,-881 520,-881 520,4 -4,4\" stroke=\"none\"/>\n",
       "<!-- 139923735866576 -->\n",
       "<g class=\"node\" id=\"node1\"><title>139923735866576</title>\n",
       "<polygon fill=\"none\" points=\"105,-830.5 105,-876.5 403,-876.5 403,-830.5 105,-830.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"167.5\" y=\"-849.8\">input_2: InputLayer</text>\n",
       "<polyline fill=\"none\" points=\"230,-830.5 230,-876.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"257.5\" y=\"-861.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"230,-853.5 285,-853.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"257.5\" y=\"-838.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"285,-830.5 285,-876.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"344\" y=\"-861.3\">(None, 900, 81, 3)</text>\n",
       "<polyline fill=\"none\" points=\"285,-853.5 403,-853.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"344\" y=\"-838.3\">(None, 900, 81, 3)</text>\n",
       "</g>\n",
       "<!-- 139923716080720 -->\n",
       "<g class=\"node\" id=\"node2\"><title>139923716080720</title>\n",
       "<polygon fill=\"none\" points=\"121,-747.5 121,-793.5 387,-793.5 387,-747.5 121,-747.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"161\" y=\"-766.8\">cnn: Model</text>\n",
       "<polyline fill=\"none\" points=\"201,-747.5 201,-793.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"228.5\" y=\"-778.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"201,-770.5 256,-770.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"228.5\" y=\"-755.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"256,-747.5 256,-793.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"321.5\" y=\"-778.3\">(None, 900, 81, 3)</text>\n",
       "<polyline fill=\"none\" points=\"256,-770.5 387,-770.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"321.5\" y=\"-755.3\">(None, 112, 10, 128)</text>\n",
       "</g>\n",
       "<!-- 139923735866576&#45;&gt;139923716080720 -->\n",
       "<g class=\"edge\" id=\"edge1\"><title>139923735866576-&gt;139923716080720</title>\n",
       "<path d=\"M254,-830.366C254,-822.152 254,-812.658 254,-803.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"257.5,-803.607 254,-793.607 250.5,-803.607 257.5,-803.607\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 139923734529104 -->\n",
       "<g class=\"node\" id=\"node3\"><title>139923734529104</title>\n",
       "<polygon fill=\"none\" points=\"98.5,-664.5 98.5,-710.5 409.5,-710.5 409.5,-664.5 98.5,-664.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"161\" y=\"-683.8\">reshape_1: Reshape</text>\n",
       "<polyline fill=\"none\" points=\"223.5,-664.5 223.5,-710.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"251\" y=\"-695.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"223.5,-687.5 278.5,-687.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"251\" y=\"-672.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"278.5,-664.5 278.5,-710.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"344\" y=\"-695.3\">(None, 112, 10, 128)</text>\n",
       "<polyline fill=\"none\" points=\"278.5,-687.5 409.5,-687.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"344\" y=\"-672.3\">(None, 112, 1280)</text>\n",
       "</g>\n",
       "<!-- 139923716080720&#45;&gt;139923734529104 -->\n",
       "<g class=\"edge\" id=\"edge2\"><title>139923716080720-&gt;139923734529104</title>\n",
       "<path d=\"M254,-747.366C254,-739.152 254,-729.658 254,-720.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"257.5,-720.607 254,-710.607 250.5,-720.607 257.5,-720.607\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 139923734923216 -->\n",
       "<g class=\"node\" id=\"node4\"><title>139923734923216</title>\n",
       "<polygon fill=\"none\" points=\"117,-581.5 117,-627.5 391,-627.5 391,-581.5 117,-581.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"168\" y=\"-600.8\">dense_1: Dense</text>\n",
       "<polyline fill=\"none\" points=\"219,-581.5 219,-627.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"246.5\" y=\"-612.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"219,-604.5 274,-604.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"246.5\" y=\"-589.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"274,-581.5 274,-627.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"332.5\" y=\"-612.3\">(None, 112, 1280)</text>\n",
       "<polyline fill=\"none\" points=\"274,-604.5 391,-604.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"332.5\" y=\"-589.3\">(None, 112, 128)</text>\n",
       "</g>\n",
       "<!-- 139923734529104&#45;&gt;139923734923216 -->\n",
       "<g class=\"edge\" id=\"edge3\"><title>139923734529104-&gt;139923734923216</title>\n",
       "<path d=\"M254,-664.366C254,-656.152 254,-646.658 254,-637.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"257.5,-637.607 254,-627.607 250.5,-637.607 257.5,-637.607\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 139923729827280 -->\n",
       "<g class=\"node\" id=\"node5\"><title>139923729827280</title>\n",
       "<polygon fill=\"none\" points=\"38.5,-498.5 38.5,-544.5 469.5,-544.5 469.5,-498.5 38.5,-498.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"171.5\" y=\"-517.8\">batch_normalization_14: BatchNormalization</text>\n",
       "<polyline fill=\"none\" points=\"304.5,-498.5 304.5,-544.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"332\" y=\"-529.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"304.5,-521.5 359.5,-521.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"332\" y=\"-506.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"359.5,-498.5 359.5,-544.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"414.5\" y=\"-529.3\">(None, 112, 128)</text>\n",
       "<polyline fill=\"none\" points=\"359.5,-521.5 469.5,-521.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"414.5\" y=\"-506.3\">(None, 112, 128)</text>\n",
       "</g>\n",
       "<!-- 139923734923216&#45;&gt;139923729827280 -->\n",
       "<g class=\"edge\" id=\"edge4\"><title>139923734923216-&gt;139923729827280</title>\n",
       "<path d=\"M254,-581.366C254,-573.152 254,-563.658 254,-554.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"257.5,-554.607 254,-544.607 250.5,-554.607 257.5,-554.607\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 139923731059472 -->\n",
       "<g class=\"node\" id=\"node6\"><title>139923731059472</title>\n",
       "<polygon fill=\"none\" points=\"94,-415.5 94,-461.5 414,-461.5 414,-415.5 94,-415.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"171.5\" y=\"-434.8\">activation_14: Activation</text>\n",
       "<polyline fill=\"none\" points=\"249,-415.5 249,-461.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"276.5\" y=\"-446.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"249,-438.5 304,-438.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"276.5\" y=\"-423.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"304,-415.5 304,-461.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"359\" y=\"-446.3\">(None, 112, 128)</text>\n",
       "<polyline fill=\"none\" points=\"304,-438.5 414,-438.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"359\" y=\"-423.3\">(None, 112, 128)</text>\n",
       "</g>\n",
       "<!-- 139923729827280&#45;&gt;139923731059472 -->\n",
       "<g class=\"edge\" id=\"edge5\"><title>139923729827280-&gt;139923731059472</title>\n",
       "<path d=\"M254,-498.366C254,-490.152 254,-480.658 254,-471.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"257.5,-471.607 254,-461.607 250.5,-471.607 257.5,-471.607\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 139923729571344 -->\n",
       "<g class=\"node\" id=\"node7\"><title>139923729571344</title>\n",
       "<polygon fill=\"none\" points=\"0,-332.5 0,-378.5 242,-378.5 242,-332.5 0,-332.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"38.5\" y=\"-351.8\">gru1: GRU</text>\n",
       "<polyline fill=\"none\" points=\"77,-332.5 77,-378.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"104.5\" y=\"-363.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"77,-355.5 132,-355.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"104.5\" y=\"-340.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"132,-332.5 132,-378.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"187\" y=\"-363.3\">(None, 112, 128)</text>\n",
       "<polyline fill=\"none\" points=\"132,-355.5 242,-355.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"187\" y=\"-340.3\">(None, 112, 128)</text>\n",
       "</g>\n",
       "<!-- 139923731059472&#45;&gt;139923729571344 -->\n",
       "<g class=\"edge\" id=\"edge6\"><title>139923731059472-&gt;139923729571344</title>\n",
       "<path d=\"M217.657,-415.366C201.676,-405.634 182.748,-394.106 165.896,-383.842\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"167.66,-380.819 157.299,-378.607 164.019,-386.798 167.66,-380.819\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 139923729570832 -->\n",
       "<g class=\"node\" id=\"node8\"><title>139923729570832</title>\n",
       "<polygon fill=\"none\" points=\"260,-332.5 260,-378.5 516,-378.5 516,-332.5 260,-332.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"305.5\" y=\"-351.8\">gru1_b: GRU</text>\n",
       "<polyline fill=\"none\" points=\"351,-332.5 351,-378.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"378.5\" y=\"-363.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"351,-355.5 406,-355.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"378.5\" y=\"-340.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"406,-332.5 406,-378.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"461\" y=\"-363.3\">(None, 112, 128)</text>\n",
       "<polyline fill=\"none\" points=\"406,-355.5 516,-355.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"461\" y=\"-340.3\">(None, 112, 128)</text>\n",
       "</g>\n",
       "<!-- 139923731059472&#45;&gt;139923729570832 -->\n",
       "<g class=\"edge\" id=\"edge7\"><title>139923731059472-&gt;139923729570832</title>\n",
       "<path d=\"M290.616,-415.366C306.717,-405.634 325.788,-394.106 342.767,-383.842\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"344.681,-386.775 351.428,-378.607 341.06,-380.785 344.681,-386.775\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 139923728014032 -->\n",
       "<g class=\"node\" id=\"node9\"><title>139923728014032</title>\n",
       "<polygon fill=\"none\" points=\"76,-249.5 76,-295.5 432,-295.5 432,-249.5 76,-249.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"116\" y=\"-268.8\">add_1: Add</text>\n",
       "<polyline fill=\"none\" points=\"156,-249.5 156,-295.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"183.5\" y=\"-280.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"156,-272.5 211,-272.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"183.5\" y=\"-257.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"211,-249.5 211,-295.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"321.5\" y=\"-280.3\">[(None, 112, 128), (None, 112, 128)]</text>\n",
       "<polyline fill=\"none\" points=\"211,-272.5 432,-272.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"321.5\" y=\"-257.3\">(None, 112, 128)</text>\n",
       "</g>\n",
       "<!-- 139923729571344&#45;&gt;139923728014032 -->\n",
       "<g class=\"edge\" id=\"edge8\"><title>139923729571344-&gt;139923728014032</title>\n",
       "<path d=\"M157.343,-332.366C173.324,-322.634 192.252,-311.106 209.104,-300.842\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"210.981,-303.798 217.701,-295.607 207.34,-297.819 210.981,-303.798\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 139923729570832&#45;&gt;139923728014032 -->\n",
       "<g class=\"edge\" id=\"edge9\"><title>139923729570832-&gt;139923728014032</title>\n",
       "<path d=\"M351.384,-332.366C335.283,-322.634 316.212,-311.106 299.233,-300.842\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"300.94,-297.785 290.572,-295.607 297.319,-303.775 300.94,-297.785\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 139923726578768 -->\n",
       "<g class=\"node\" id=\"node10\"><title>139923726578768</title>\n",
       "<polygon fill=\"none\" points=\"0,-166.5 0,-212.5 242,-212.5 242,-166.5 0,-166.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"38.5\" y=\"-185.8\">gru2: GRU</text>\n",
       "<polyline fill=\"none\" points=\"77,-166.5 77,-212.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"104.5\" y=\"-197.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"77,-189.5 132,-189.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"104.5\" y=\"-174.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"132,-166.5 132,-212.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"187\" y=\"-197.3\">(None, 112, 128)</text>\n",
       "<polyline fill=\"none\" points=\"132,-189.5 242,-189.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"187\" y=\"-174.3\">(None, 112, 128)</text>\n",
       "</g>\n",
       "<!-- 139923728014032&#45;&gt;139923726578768 -->\n",
       "<g class=\"edge\" id=\"edge10\"><title>139923728014032-&gt;139923726578768</title>\n",
       "<path d=\"M217.657,-249.366C201.676,-239.634 182.748,-228.106 165.896,-217.842\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"167.66,-214.819 157.299,-212.607 164.019,-220.798 167.66,-214.819\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 139923726578256 -->\n",
       "<g class=\"node\" id=\"node11\"><title>139923726578256</title>\n",
       "<polygon fill=\"none\" points=\"260,-166.5 260,-212.5 516,-212.5 516,-166.5 260,-166.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"305.5\" y=\"-185.8\">gru2_b: GRU</text>\n",
       "<polyline fill=\"none\" points=\"351,-166.5 351,-212.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"378.5\" y=\"-197.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"351,-189.5 406,-189.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"378.5\" y=\"-174.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"406,-166.5 406,-212.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"461\" y=\"-197.3\">(None, 112, 128)</text>\n",
       "<polyline fill=\"none\" points=\"406,-189.5 516,-189.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"461\" y=\"-174.3\">(None, 112, 128)</text>\n",
       "</g>\n",
       "<!-- 139923728014032&#45;&gt;139923726578256 -->\n",
       "<g class=\"edge\" id=\"edge11\"><title>139923728014032-&gt;139923726578256</title>\n",
       "<path d=\"M290.616,-249.366C306.717,-239.634 325.788,-228.106 342.767,-217.842\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"344.681,-220.775 351.428,-212.607 341.06,-214.785 344.681,-220.775\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 139923722020240 -->\n",
       "<g class=\"node\" id=\"node12\"><title>139923722020240</title>\n",
       "<polygon fill=\"none\" points=\"32,-83.5 32,-129.5 476,-129.5 476,-83.5 32,-83.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"116\" y=\"-102.8\">concatenate_1: Concatenate</text>\n",
       "<polyline fill=\"none\" points=\"200,-83.5 200,-129.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"227.5\" y=\"-114.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"200,-106.5 255,-106.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"227.5\" y=\"-91.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"255,-83.5 255,-129.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"365.5\" y=\"-114.3\">[(None, 112, 128), (None, 112, 128)]</text>\n",
       "<polyline fill=\"none\" points=\"255,-106.5 476,-106.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"365.5\" y=\"-91.3\">(None, 112, 256)</text>\n",
       "</g>\n",
       "<!-- 139923726578768&#45;&gt;139923722020240 -->\n",
       "<g class=\"edge\" id=\"edge12\"><title>139923726578768-&gt;139923722020240</title>\n",
       "<path d=\"M157.343,-166.366C173.324,-156.634 192.252,-145.106 209.104,-134.842\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"210.981,-137.798 217.701,-129.607 207.34,-131.819 210.981,-137.798\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 139923726578256&#45;&gt;139923722020240 -->\n",
       "<g class=\"edge\" id=\"edge13\"><title>139923726578256-&gt;139923722020240</title>\n",
       "<path d=\"M351.384,-166.366C335.283,-156.634 316.212,-145.106 299.233,-134.842\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"300.94,-131.785 290.572,-129.607 297.319,-137.775 300.94,-131.785\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 139925857015888 -->\n",
       "<g class=\"node\" id=\"node13\"><title>139925857015888</title>\n",
       "<polygon fill=\"none\" points=\"120.5,-0.5 120.5,-46.5 387.5,-46.5 387.5,-0.5 120.5,-0.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"171.5\" y=\"-19.8\">dense_2: Dense</text>\n",
       "<polyline fill=\"none\" points=\"222.5,-0.5 222.5,-46.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"250\" y=\"-31.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"222.5,-23.5 277.5,-23.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"250\" y=\"-8.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"277.5,-0.5 277.5,-46.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"332.5\" y=\"-31.3\">(None, 112, 256)</text>\n",
       "<polyline fill=\"none\" points=\"277.5,-23.5 387.5,-23.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"332.5\" y=\"-8.3\">(None, 112, 45)</text>\n",
       "</g>\n",
       "<!-- 139923722020240&#45;&gt;139925857015888 -->\n",
       "<g class=\"edge\" id=\"edge14\"><title>139923722020240-&gt;139925857015888</title>\n",
       "<path d=\"M254,-83.3664C254,-75.1516 254,-65.6579 254,-56.7252\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"257.5,-56.6068 254,-46.6068 250.5,-56.6069 257.5,-56.6068\" stroke=\"black\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>"
      ],
      "text/plain": [
       "<IPython.core.display.SVG object>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "SVG(model_to_dot(base_model, show_shapes=True).create(prog='dot', format='svg'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 生成器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 100000/100000 [01:08<00:00, 1460.24it/s]\n"
     ]
    }
   ],
   "source": [
    "from collections import defaultdict\n",
    "\n",
    "cn_imgs = defaultdict(list)\n",
    "cn_labels = defaultdict(list)\n",
    "ss_imgs = []\n",
    "ss_labels = []\n",
    "\n",
    "for i in tqdm(range(n)):\n",
    "    ss = df[0][i].decode('utf-8').split(';')\n",
    "    m = len(ss)-1\n",
    "    ss_labels.append(ss[-1])\n",
    "    ss_imgs.append(cv2.imread('crop_split2/%d_%d.png'%(i, 0)).transpose(1, 0, 2))\n",
    "    for j in range(m):\n",
    "        cn_labels[ss[j][0]].append(ss[j])\n",
    "        cn_imgs[ss[j][0]].append(cv2.imread('crop_split2/%d_%d.png'%(i, m-j)).transpose(1, 0, 2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from keras.utils import Sequence\n",
    "\n",
    "class SGen(Sequence):\n",
    "    def __init__(self, batch_size):\n",
    "        self.batch_size = batch_size\n",
    "        self.X_gen = np.zeros((batch_size, width, height, 3), dtype=np.uint8)\n",
    "        self.y_gen = np.zeros((batch_size, n_len), dtype=np.uint8)\n",
    "        self.input_length = np.ones(batch_size)*rnn_length\n",
    "        self.label_length = np.ones(batch_size)*n_len\n",
    "    \n",
    "    def __len__(self):\n",
    "        return 100000 // self.batch_size\n",
    "    \n",
    "    def __getitem__(self, idx):\n",
    "        self.X_gen[:] = 0\n",
    "        for i in range(self.batch_size):\n",
    "            try:\n",
    "                random_index = random.randint(0, n-1)\n",
    "                cls = []\n",
    "                ss = ss_labels[random_index]\n",
    "                cs = re.findall(ur'[\\u4e00-\\u9fff]', df[0][random_index].decode('utf-8').split(';')[-1])\n",
    "                random.shuffle(cs)\n",
    "                x = 0\n",
    "                for c in cs:\n",
    "                    random_index2 = random.randint(0, len(cn_labels[c])-1)\n",
    "                    cls.append(cn_labels[c][random_index2])\n",
    "                    img = cn_imgs[c][random_index2]\n",
    "                    w, h, _ = img.shape\n",
    "                    self.X_gen[i, x:x+w, :h] = img\n",
    "                    x += w+2\n",
    "                img = ss_imgs[random_index]\n",
    "                w, h, _ = img.shape\n",
    "                self.X_gen[i, x:x+w, :h] = img\n",
    "                cls.append(ss)\n",
    "\n",
    "                random_str = u';'.join(cls)\n",
    "                self.y_gen[i,:len(random_str)] = [characters.find(x) for x in random_str]\n",
    "                self.y_gen[i,len(random_str):] = n_class-1\n",
    "                self.label_length[i] = len(random_str)\n",
    "            except:\n",
    "                pass\n",
    "        \n",
    "        return [self.X_gen, self.y_gen, self.input_length, self.label_length], np.ones(self.batch_size)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 可视化生成器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "110.0\n",
      "37.0\n",
      "河=30256;55870*((河/34742-95728)*56527)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "gen = SGen(1)\n",
    "(X_vis, y_vis, input_length_vis, label_length_vis), _ = gen[0]\n",
    "print input_length_vis[0]\n",
    "print label_length_vis[0]\n",
    "print decode(y_vis[0])\n",
    "disp2(X_vis[0].transpose((1, 0, 2)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from keras.callbacks import *\n",
    "\n",
    "def train(epochs=10, optimizer=None, batch_size=128, callbacks=None):\n",
    "    if optimizer:\n",
    "        model.compile(loss={'ctc': lambda y_true, y_pred: y_pred}, optimizer=optimizer)\n",
    "    model.fit_generator(SGen(batch_size), steps_per_epoch=380, epochs=epochs, callbacks=callbacks, \n",
    "                        workers=6, use_multiprocessing=True)\n",
    "\n",
    "cl = CSVLogger('model_%s.csv' % DESCRIPTION, append=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/50\n",
      "380/380 [==============================] - 475s - loss: 65.8563   \n",
      "Epoch 2/50\n",
      "380/380 [==============================] - 473s - loss: 1.8006   \n",
      "Epoch 3/50\n",
      "380/380 [==============================] - 475s - loss: 1.0044   \n",
      "Epoch 4/50\n",
      "380/380 [==============================] - 476s - loss: 0.8183   \n",
      "Epoch 5/50\n",
      "380/380 [==============================] - 476s - loss: 0.7169   \n",
      "Epoch 6/50\n",
      "380/380 [==============================] - 477s - loss: 0.7071   \n",
      "Epoch 7/50\n",
      "380/380 [==============================] - 477s - loss: 0.6579   \n",
      "Epoch 8/50\n",
      "380/380 [==============================] - 479s - loss: 0.6696   \n",
      "Epoch 9/50\n",
      "380/380 [==============================] - 476s - loss: 0.6131   \n",
      "Epoch 10/50\n",
      "380/380 [==============================] - 477s - loss: 0.6375   \n",
      "Epoch 11/50\n",
      "380/380 [==============================] - 475s - loss: 0.8672   \n",
      "Epoch 12/50\n",
      "380/380 [==============================] - 473s - loss: 0.5939   \n",
      "Epoch 13/50\n",
      "380/380 [==============================] - 469s - loss: 0.5733   \n",
      "Epoch 14/50\n",
      "380/380 [==============================] - 469s - loss: 0.5690   \n",
      "Epoch 15/50\n",
      "380/380 [==============================] - 465s - loss: 0.5572   \n",
      "Epoch 16/50\n",
      "380/380 [==============================] - 466s - loss: 0.5778   \n",
      "Epoch 17/50\n",
      "380/380 [==============================] - 466s - loss: 0.5492   \n",
      "Epoch 18/50\n",
      "380/380 [==============================] - 465s - loss: 0.5058   \n",
      "Epoch 19/50\n",
      "380/380 [==============================] - 466s - loss: 0.5056   \n",
      "Epoch 20/50\n",
      "380/380 [==============================] - 466s - loss: 0.4809   \n",
      "Epoch 21/50\n",
      "380/380 [==============================] - 466s - loss: 0.5138   \n",
      "Epoch 22/50\n",
      "380/380 [==============================] - 467s - loss: 0.6716   \n",
      "Epoch 23/50\n",
      "380/380 [==============================] - 463s - loss: 0.6949   \n",
      "Epoch 24/50\n",
      "380/380 [==============================] - 462s - loss: 0.5731   \n",
      "Epoch 25/50\n",
      "380/380 [==============================] - 462s - loss: 0.5324   \n",
      "Epoch 26/50\n",
      "380/380 [==============================] - 464s - loss: 0.5064   \n",
      "Epoch 27/50\n",
      "380/380 [==============================] - 461s - loss: 0.5062   \n",
      "Epoch 28/50\n",
      "380/380 [==============================] - 463s - loss: 0.5897   \n",
      "Epoch 29/50\n",
      "380/380 [==============================] - 461s - loss: 0.5055   \n",
      "Epoch 30/50\n",
      "380/380 [==============================] - 461s - loss: 0.4782   \n",
      "Epoch 31/50\n",
      "380/380 [==============================] - 460s - loss: 0.4616   \n",
      "Epoch 32/50\n",
      "380/380 [==============================] - 460s - loss: 0.4660   \n",
      "Epoch 33/50\n",
      "380/380 [==============================] - 461s - loss: 0.4467   \n",
      "Epoch 34/50\n",
      "380/380 [==============================] - 459s - loss: 0.4399   \n",
      "Epoch 35/50\n",
      "380/380 [==============================] - 461s - loss: 0.4553   \n",
      "Epoch 36/50\n",
      "380/380 [==============================] - 461s - loss: 0.4060   \n",
      "Epoch 37/50\n",
      "380/380 [==============================] - 461s - loss: 0.4669   \n",
      "Epoch 38/50\n",
      "380/380 [==============================] - 462s - loss: 0.4154   \n",
      "Epoch 39/50\n",
      "380/380 [==============================] - 460s - loss: 0.4036   \n",
      "Epoch 40/50\n",
      "380/380 [==============================] - 460s - loss: 0.3850   \n",
      "Epoch 41/50\n",
      "380/380 [==============================] - 462s - loss: 0.3850   \n",
      "Epoch 42/50\n",
      "380/380 [==============================] - 461s - loss: 0.4062   \n",
      "Epoch 43/50\n",
      "380/380 [==============================] - 462s - loss: 0.3744   \n",
      "Epoch 44/50\n",
      "380/380 [==============================] - 462s - loss: 0.3649   \n",
      "Epoch 45/50\n",
      "380/380 [==============================] - 461s - loss: 0.3772   \n",
      "Epoch 46/50\n",
      "380/380 [==============================] - 461s - loss: 0.4975   \n",
      "Epoch 47/50\n",
      "380/380 [==============================] - 462s - loss: 0.4096   \n",
      "Epoch 48/50\n",
      "380/380 [==============================] - 461s - loss: 0.4219   \n",
      "Epoch 49/50\n",
      "380/380 [==============================] - 462s - loss: 0.3641   \n",
      "Epoch 50/50\n",
      "380/380 [==============================] - 462s - loss: 0.3669   \n"
     ]
    }
   ],
   "source": [
    "opt = Adam()\n",
    "train(epochs=50, optimizer=opt, callbacks=[cl])\n",
    "base_model.save('model_%s_50.h5' % DESCRIPTION)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/50\n",
      "380/380 [==============================] - 465s - loss: 0.3209   \n",
      "Epoch 2/50\n",
      "380/380 [==============================] - 459s - loss: 0.3043   \n",
      "Epoch 3/50\n",
      "380/380 [==============================] - 459s - loss: 0.3075   \n",
      "Epoch 4/50\n",
      "380/380 [==============================] - 460s - loss: 0.2844   \n",
      "Epoch 5/50\n",
      "380/380 [==============================] - 460s - loss: 0.2744   \n",
      "Epoch 6/50\n",
      "380/380 [==============================] - 459s - loss: 0.2775   \n",
      "Epoch 7/50\n",
      "380/380 [==============================] - 459s - loss: 0.2554   \n",
      "Epoch 8/50\n",
      "380/380 [==============================] - 459s - loss: 0.2475   \n",
      "Epoch 9/50\n",
      "380/380 [==============================] - 459s - loss: 0.2393   \n",
      "Epoch 10/50\n",
      "380/380 [==============================] - 461s - loss: 0.2324   \n",
      "Epoch 11/50\n",
      "380/380 [==============================] - 459s - loss: 0.2275   \n",
      "Epoch 12/50\n",
      "380/380 [==============================] - 460s - loss: 0.2200   \n",
      "Epoch 13/50\n",
      "380/380 [==============================] - 461s - loss: 0.2163   \n",
      "Epoch 14/50\n",
      "380/380 [==============================] - 460s - loss: 0.2116   \n",
      "Epoch 15/50\n",
      "380/380 [==============================] - 458s - loss: 0.2067   \n",
      "Epoch 16/50\n",
      "380/380 [==============================] - 461s - loss: 0.2015   \n",
      "Epoch 17/50\n",
      "380/380 [==============================] - 460s - loss: 0.1958   \n",
      "Epoch 18/50\n",
      "380/380 [==============================] - 460s - loss: 0.1933   \n",
      "Epoch 19/50\n",
      "380/380 [==============================] - 459s - loss: 0.1918   \n",
      "Epoch 20/50\n",
      "380/380 [==============================] - 461s - loss: 0.1863   \n",
      "Epoch 21/50\n",
      "380/380 [==============================] - 461s - loss: 0.1818   \n",
      "Epoch 22/50\n",
      "380/380 [==============================] - 462s - loss: 0.1788   \n",
      "Epoch 23/50\n",
      "380/380 [==============================] - 459s - loss: 0.1752   \n",
      "Epoch 24/50\n",
      "380/380 [==============================] - 460s - loss: 0.1715   \n",
      "Epoch 25/50\n",
      "380/380 [==============================] - 461s - loss: 0.1839   \n",
      "Epoch 26/50\n",
      "380/380 [==============================] - 461s - loss: 0.1771   \n",
      "Epoch 27/50\n",
      "380/380 [==============================] - 460s - loss: 0.1737   \n",
      "Epoch 28/50\n",
      "380/380 [==============================] - 461s - loss: 0.1633   \n",
      "Epoch 29/50\n",
      "380/380 [==============================] - 461s - loss: 0.1594   \n",
      "Epoch 30/50\n",
      "380/380 [==============================] - 460s - loss: 0.1561   \n",
      "Epoch 31/50\n",
      "380/380 [==============================] - 461s - loss: 0.1551   \n",
      "Epoch 32/50\n",
      "380/380 [==============================] - 463s - loss: 0.1513   \n",
      "Epoch 33/50\n",
      "380/380 [==============================] - 462s - loss: 0.1497   \n",
      "Epoch 34/50\n",
      "380/380 [==============================] - 461s - loss: 0.1498   \n",
      "Epoch 35/50\n",
      "380/380 [==============================] - 461s - loss: 0.1459   \n",
      "Epoch 36/50\n",
      "380/380 [==============================] - 463s - loss: 0.1435   \n",
      "Epoch 37/50\n",
      "380/380 [==============================] - 464s - loss: 0.1413   \n",
      "Epoch 38/50\n",
      "380/380 [==============================] - 464s - loss: 0.1547   \n",
      "Epoch 39/50\n",
      "380/380 [==============================] - 469s - loss: 0.1357   \n",
      "Epoch 40/50\n",
      "380/380 [==============================] - 470s - loss: 0.1348   \n",
      "Epoch 41/50\n",
      "380/380 [==============================] - 469s - loss: 0.1339   \n",
      "Epoch 42/50\n",
      "380/380 [==============================] - 469s - loss: 0.1334   \n",
      "Epoch 43/50\n",
      "380/380 [==============================] - 470s - loss: 0.1296   \n",
      "Epoch 44/50\n",
      "380/380 [==============================] - 468s - loss: 0.1276   \n",
      "Epoch 45/50\n",
      "380/380 [==============================] - 469s - loss: 0.1291   \n",
      "Epoch 46/50\n",
      "380/380 [==============================] - 470s - loss: 0.1247   \n",
      "Epoch 47/50\n",
      "380/380 [==============================] - 469s - loss: 0.1220   \n",
      "Epoch 48/50\n",
      "380/380 [==============================] - 464s - loss: 0.1320   \n",
      "Epoch 49/50\n",
      "380/380 [==============================] - 460s - loss: 0.1223   \n",
      "Epoch 50/50\n",
      "380/380 [==============================] - 464s - loss: 0.1188   \n"
     ]
    }
   ],
   "source": [
    "opt = Adam(1e-4)\n",
    "train(epochs=50, optimizer=opt, callbacks=[cl])\n",
    "base_model.save('model_%s_100.h5' % DESCRIPTION)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/50\n",
      "380/380 [==============================] - 465s - loss: 0.1173   \n",
      "Epoch 2/50\n",
      "380/380 [==============================] - 458s - loss: 0.1164   \n",
      "Epoch 3/50\n",
      "380/380 [==============================] - 460s - loss: 0.1164   \n",
      "Epoch 4/50\n",
      "380/380 [==============================] - 459s - loss: 0.1158   \n",
      "Epoch 5/50\n",
      "380/380 [==============================] - 459s - loss: 0.1156   \n",
      "Epoch 6/50\n",
      "380/380 [==============================] - 458s - loss: 0.1230   \n",
      "Epoch 7/50\n",
      "380/380 [==============================] - 459s - loss: 0.1148   \n",
      "Epoch 8/50\n",
      "380/380 [==============================] - 459s - loss: 0.1146   \n",
      "Epoch 9/50\n",
      "380/380 [==============================] - 460s - loss: 0.1142   \n",
      "Epoch 10/50\n",
      "380/380 [==============================] - 461s - loss: 0.1139   \n",
      "Epoch 11/50\n",
      "380/380 [==============================] - 459s - loss: 0.1137   \n",
      "Epoch 12/50\n",
      "380/380 [==============================] - 460s - loss: 0.1210   \n",
      "Epoch 13/50\n",
      "380/380 [==============================] - 462s - loss: 0.1131   \n",
      "Epoch 14/50\n",
      "380/380 [==============================] - 458s - loss: 0.1197   \n",
      "Epoch 15/50\n",
      "380/380 [==============================] - 460s - loss: 0.1125   \n",
      "Epoch 16/50\n",
      "380/380 [==============================] - 459s - loss: 0.1125   \n",
      "Epoch 17/50\n",
      "380/380 [==============================] - 452s - loss: 0.1118   \n",
      "Epoch 18/50\n",
      "380/380 [==============================] - 452s - loss: 0.1116   \n",
      "Epoch 19/50\n",
      "380/380 [==============================] - 451s - loss: 0.1109   \n",
      "Epoch 20/50\n",
      "380/380 [==============================] - 451s - loss: 0.1104   \n",
      "Epoch 21/50\n",
      "380/380 [==============================] - 450s - loss: 0.1173   \n",
      "Epoch 22/50\n",
      "380/380 [==============================] - 451s - loss: 0.1095   \n",
      "Epoch 23/50\n",
      "380/380 [==============================] - 450s - loss: 0.1091   \n",
      "Epoch 24/50\n",
      "380/380 [==============================] - 451s - loss: 0.1088   \n",
      "Epoch 25/50\n",
      "380/380 [==============================] - 450s - loss: 0.1085   \n",
      "Epoch 26/50\n",
      "380/380 [==============================] - 453s - loss: 0.1080   \n",
      "Epoch 27/50\n",
      "380/380 [==============================] - 456s - loss: 0.1148   \n",
      "Epoch 28/50\n",
      "380/380 [==============================] - 456s - loss: 0.1071   \n",
      "Epoch 29/50\n",
      "380/380 [==============================] - 456s - loss: 0.1067   \n",
      "Epoch 30/50\n",
      "380/380 [==============================] - 457s - loss: 0.1139   \n",
      "Epoch 31/50\n",
      "380/380 [==============================] - 456s - loss: 0.1060   \n",
      "Epoch 32/50\n",
      "380/380 [==============================] - 458s - loss: 0.1057   \n",
      "Epoch 33/50\n",
      "380/380 [==============================] - 456s - loss: 0.1054   \n",
      "Epoch 34/50\n",
      "380/380 [==============================] - 457s - loss: 0.1050   \n",
      "Epoch 35/50\n",
      "380/380 [==============================] - 456s - loss: 0.1119   \n",
      "Epoch 36/50\n",
      "380/380 [==============================] - 458s - loss: 0.1042   \n",
      "Epoch 37/50\n",
      "380/380 [==============================] - 458s - loss: 0.1037   \n",
      "Epoch 38/50\n",
      "380/380 [==============================] - 458s - loss: 0.1031   \n",
      "Epoch 39/50\n",
      "380/380 [==============================] - 457s - loss: 0.1025   \n",
      "Epoch 40/50\n",
      "380/380 [==============================] - 458s - loss: 0.1086   \n",
      "Epoch 41/50\n",
      "380/380 [==============================] - 457s - loss: 0.1083   \n",
      "Epoch 42/50\n",
      "380/380 [==============================] - 459s - loss: 0.1009   \n",
      "Epoch 43/50\n",
      "380/380 [==============================] - 457s - loss: 0.1004   \n",
      "Epoch 44/50\n",
      "380/380 [==============================] - 456s - loss: 0.0999   \n",
      "Epoch 45/50\n",
      "380/380 [==============================] - 458s - loss: 0.0993   \n",
      "Epoch 46/50\n",
      "380/380 [==============================] - 461s - loss: 0.1059   \n",
      "Epoch 47/50\n",
      "380/380 [==============================] - 459s - loss: 0.1049   \n",
      "Epoch 48/50\n",
      "380/380 [==============================] - 461s - loss: 0.0980   \n",
      "Epoch 49/50\n",
      "380/380 [==============================] - 461s - loss: 0.1043   \n",
      "Epoch 50/50\n",
      "380/380 [==============================] - 462s - loss: 0.0976   \n"
     ]
    }
   ],
   "source": [
    "opt = Adam(1e-5)\n",
    "train(epochs=50, optimizer=opt, callbacks=[cl])\n",
    "base_model.save('model_%s_150.h5' % DESCRIPTION)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
